$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day20
$ unzip opencv.zip
$ cd opencv-4
$ mkdir build
$ cd build
$ cmake ..
$ make -j 4
make -j
這個參數的意思是使用幾核心進行編譯,因為opencv原始碼太複雜了,因此使用多核心編譯速度會比較快
這個時候可以選擇將 OpenCV 安裝至 PATH 的系統路徑中,也可以選擇指定 ${OpenCV_DIR} 的值,各有優缺點。
接下來的兩個範例就是分別使用這兩種方式來使用 OpenCV>。
1. 編輯 CMakeLists.txt
為了要讓 find_package 找到 OpenCVConfig.cmake 這個設定檔,就要設定 ${OpenCV_DIR} 到 OpenCVConfig.cmake 所在資料夾。
kai@esoc:~/2023_iT_CMake/Day20/opencv-4.x/build$ tree -L 1
.
├── OpenCV-bf1094e-x86_64.sh
├── OpenCV-bf1094e-x86_64.tar.gz
├── OpenCV-bf1094e-x86_64.tar.Z
├── OpenCVConfig.cmake <-----在這裡 ⭐
├── OpenCVConfig-version.cmake
└── version_string.tmp
set(OpenCV_DIR ${CMAKE_CURRENT_LIST_DIR}/../opencv-4.x/build)
# 設定 OpenCV_DIR 到 OpenCVConfig.cmake 所在資料夾
find_package(OpenCV REQUIRED)
# 尋找 OpenCV 這個第三方庫,REQUIRED 代表如果沒找到就會報錯
接下來,為了驗證find_package() 定義的變數,使用 message 印出內容
message(STATUS "OpenCV library status:")
message(STATUS "version: ${OpenCV_VERSION}")
message(STATUS "libraries: ${OpenCV_LIBS}")
message(STATUS "include path: ${OpenCV_INCLUDE_DIRS}")
最後,引入 OpenCV 的標頭檔,並將主程式與OpenCV的函式庫練接
include_directories(${OpenCV_INCLUDE_DIRS})
# 將 OpenCV 的 include 路徑加入到專案中
add_executable(main src/main.cpp)
# 將 main.cpp 編譯成可執行文件 main
target_link_libraries(main ${OpenCV_LIBS})
# 將 OpenCV 的 library 路徑加入到專案中
2. 編譯與執行主程式
$ cd build
$ cmake ..
這個時候,find_package 會顯示在哪個地方找到 OpenCV 的訊息。
kai@esoc:~/2023_iT_CMake/Day20/直接指定OpenCV_DIR路徑/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /home/kai/2023_iT_CMake/Day20/opencv-4.x/build (found version "4.8.0") <-----在這裡找到OpenCV ⭐
-- OpenCV library status:
-- version: 4.8.0
繼續編譯與執行
$ make
$ ./main ./../img/cmake_logo_icon.png
執行後就會顯示出以下圖片,就說明我們順利地使用 OpenCV 的函式庫了!
3. 分析鍊結的路徑
可以發現,鍊結到的庫都是在 Day20/opencv-4.x/build 的各個資料夾下的庫,如果沒有 find_package 幫我們管理這些路徑,要使用大型的第三方庫是非常困難的一件事。
$ ldd main
kai@esoc:~/2023_iT_CMake/Day20/直接指定OpenCV_DIR路徑/build$ ldd main
linux-vdso.so.1 (0x00007ffe80d93000)
libopencv_highgui.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_highgui.so.408 (0x00007f60866a8000)
libopencv_imgcodecs.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_imgcodecs.so.408 (0x00007f6086637000)
libopencv_core.so.408 => /home/kai/2023_iT_CMake/Day20/opencv-4.x/build/lib/libopencv_core.so.408 (0x00007f6085800000)
1.進入 build 資料夾,將Config檔、頭文件、庫文件安裝至系統路徑內
$ cd /Day20/opencv-4.x/build
$ sudo make install
# set(OpenCV_DIR ${CMAKE_CURRENT_LIST_DIR}/../opencv-4.x/build)
# 設定 OpenCV_DIR 到 OpenCVConfig.cmake 所在資料夾
find_package(OpenCV REQUIRED)
# 尋找 OpenCV 這個第三方庫,REQUIRED 代表如果沒找到就會報錯
$ cd Day20/安裝至系統路徑/build
$ cmake ..
這個時候可以看到,find_package 在系統路徑 /usr/local 中找到 OpenCV 的設定檔。
kai@esoc:~/2023_iT_CMake/Day20/安裝至系統路徑/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.8.0") <-----在這裡找到OpenCV ⭐
-- OpenCV library status:
-- version: 4.8.0
kai@esoc:/usr/local/lib/cmake/opencv4$ tree
.
├── OpenCVConfig.cmake <-----Config檔在這裡 ⭐
├── OpenCVConfig-version.cmake
├── OpenCVModules.cmake
└── OpenCVModules-release.cmake
繼續編譯與執行
$ make
$ ./main ./../img/cmake_logo_icon.png
3. 分析鍊結的路徑
可以發現,鍊結到的庫都是在系統路徑下。
$ ldd main
kai@esoc:~/2023_iT_CMake/Day20/安裝至系統路徑/build$ ldd main
linux-vdso.so.1 (0x00007fff4a491000)
libopencv_highgui.so.408 => /usr/local/lib/libopencv_highgui.so.408 (0x00007fb30532a000)
libopencv_imgcodecs.so.408 => /usr/local/lib/libopencv_imgcodecs.so.408 (0x00007fb3052b9000)
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0x00007fb304400000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb304000000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb305275000)